﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using popLib;
using System.Windows.Forms;
using System.Data;
using System.Collections;
using System.Drawing;
using System.Data.Common;
using System.ComponentModel;
using PhotoMgr.src.database;
using PhotoMgr.Properties;

namespace PhotoMgr.src.common
{
    public static class Global
    {

        public static DateTime NullDateTime { get { return new DateTime(1900, 1, 1, 0, 0, 0).Date; } }
        public static DateTime MaxDateTime { get { return new DateTime(9998, 1, 1, 0, 0, 0).Date; } }
        private static TimeSpan ShiftTime;        


        #region text formating helpers

        /// <summary>
        /// Format money to standard, all letter will be eliminated.
        /// Ex: 10000 -> 10,000
        /// Ex: abc10000 -> 10,000
        /// </summary>
        /// <param name="money"></param>
        /// <returns></returns>
        public static string FormatMoney(object money)
        {

            return NumberLib.getDouble(money).ToString("#,##0.##");
        }

        /// <summary>
        /// Format money and add subfix at the end of return value
        /// Ex: 10000 -> 10,000 VND
        /// Ex: abc10000 -> 10,000 VND
        /// </summary>
        /// <param name="money">money can be string, int, double .etc</param>
        /// <param name="subFix">subfix such as VND, USD .etc</param>
        /// <returns></returns>
        public static string FormatMoney(object money, string subFix)
        {
            return NumberLib.getInt64(money).ToString("#,##0") + " " + subFix;
        }

        /// <summary>
        /// Format money value for TextBox after Leave Event or when user press ENTER
        /// </summary>
        /// <param name="control">It could be TextBox</param>
        public static void FormatMoneyControl(TextBox control)
        {
            EventHandler eventhandler = delegate(object sender, EventArgs e)
            {
                TextBox sender1 = (TextBox)sender;
                sender1.Text = FormatMoney(sender1.Text);
            };

            KeyEventHandler keyeventhandler = delegate(object sender, KeyEventArgs e)
            {
                TextBox sender1 = (TextBox)sender;
                if (e.KeyCode == Keys.Return)
                {
                    sender1.Text = FormatMoney(sender1.Text);
                    sender1.Select(sender1.Text.Length, 0);
                }
            };

            control.Leave += eventhandler;
            control.KeyUp += keyeventhandler;
        }

        public static double RoundMoneyCeiling(double money)
        {
            if (money.ToString().Length > 3)
            {
                string strmoney = money.ToString();
                strmoney = strmoney.Split('.')[0];

                double hundred = NumberLib.getDouble(strmoney.Substring(strmoney.Length - 3));
                if (hundred > 0)
                {
                    double thousand = NumberLib.getDouble(strmoney.Substring(0, strmoney.Length - 3));
                    money = thousand + 1000;
                }
                return money;
            }
            else if (money > 0)
            {
                return 1000;
            }
            else
            {
                return money;
            }
        }

        public static string ToTextString(this double number)
        {
            string s = number.ToString("#");
            string[] so = new string[] { "không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín" };
            string[] hang = new string[] { "", "nghìn", "triệu", "tỷ" };
            int i, j, donvi, chuc, tram;
            string str = " ";
            bool booAm = false;
            double decS = 0;
            //Tung addnew
            try
            {
                decS = Convert.ToDouble(s.ToString());
            }
            catch
            {
            }
            if (decS < 0)
            {
                decS = -decS;
                s = decS.ToString();
                booAm = true;
            }
            i = s.Length;
            if (i == 0)
                str = so[0] + str;
            else
            {
                j = 0;
                while (i > 0)
                {
                    donvi = Convert.ToInt32(s.Substring(i - 1, 1));
                    i--;
                    if (i > 0)
                        chuc = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        chuc = -1;
                    i--;
                    if (i > 0)
                        tram = Convert.ToInt32(s.Substring(i - 1, 1));
                    else
                        tram = -1;
                    i--;
                    if ((donvi > 0) || (chuc > 0) || (tram > 0) || (j == 3))
                        str = hang[j] + str;
                    j++;
                    if (j > 3) j = 1;
                    if ((donvi == 1) && (chuc > 1))
                        str = "một " + str;
                    else
                    {
                        if ((donvi == 5) && (chuc > 0))
                            str = "lăm " + str;
                        else if (donvi > 0)
                            str = so[donvi] + " " + str;
                    }
                    if (chuc < 0)
                        break;
                    else
                    {
                        if ((chuc == 0) && (donvi > 0)) str = "lẻ " + str;
                        if (chuc == 1) str = "mười " + str;
                        if (chuc > 1) str = so[chuc] + " mươi " + str;
                    }
                    if (tram < 0) break;
                    else
                    {
                        if ((tram > 0) || (chuc > 0) || (donvi > 0)) str = so[tram] + " trăm " + str;
                    }
                    str = " " + str;
                }
            }
            if (booAm) str = "Âm " + str;

            str = str + "đồng chẵn";

            str = StringLib.UpperFirstLetter(str.Trim().Replace("  ", " "));

            return str;
        }

        public static string ToGioNgayString(this DateTime dat)
        {
            return string.Format("{0:HH} giờ {1:mm} ngày {2:dd/MM/yyyy}", dat, dat, dat);
        }

        public static string ToNgayThangNamString(this DateTime dat)
        {
            return string.Format("Ngày {0:dd} tháng {1:MM} năm {2:yyyy}", dat, dat, dat);
        }

        public static string ToDMYString(this DateTime dat)
        {
            return dat.ToString("dd/MM/yyyy");
        }

        public static string ToTRUEString(this bool value)
        {
            return value ? "X" : "";
        }

        public static string ToFALSEString(this bool value)
        {
            return value ? "" : "X";
        }

        public static string ConvertVNI2Unicode(string strInput)
        {
            int[] maAcii = new int[134] { 7845, 7847, 7849, 7851, 7853, 226, 7843, 227, 7841, 7855, 7857, 7859, 7861, 7863, 259, 250, 249, 7911, 361, 7909, 7913, 7915, 7917, 7919, 7921, 432, 7871, 7873, 7875, 7877, 7879, 234, 233, 232, 7867, 7869, 7865, 7889, 7891, 7893, 7895, 7897, 7887, 245, 7885, 7899, 7901, 7903, 7905, 7907, 417, 237, 236, 7881, 297, 7883, 253, 7923, 7927, 7929, 7925, 273, 7844, 7846, 7848, 7850, 7852, 194, 7842, 195, 7840, 7854, 7856, 7858, 7860, 7862, 258, 218, 217, 7910, 360, 7908, 7912, 7914, 7916, 7918, 7920, 431, 7870, 7872, 7874, 7876, 7878, 202, 201, 200, 7866, 7868, 7864, 7888, 7890, 7892, 7894, 7896, 7886, 213, 7884, 7898, 7900, 7902, 7904, 7906, 416, 205, 204, 7880, 296, 7882, 221, 7922, 7926, 7928, 7924, 272, 225, 224, 244, 243, 242, 193, 192, 212, 211, 210 };

            string[] Vni = new string[134]{"aá", "aà", "aå", "aã", "aä", "aâ", "aû", "aõ", "aï", "aé", "aè",

                            "aú", "aü", "aë", "aê", "uù", "uø", "uû", "uõ", "uï", "öù", "öø", "öû", "öõ",

                            "öï", "ö", "eá", "eà", "eå", "eã", "eä", "eâ", "eù", "eø", "eû", "eõ", "eï",

                            "oá", "oà", "oå", "oã", "oä", "oû", "oõ", "oï", "ôù", "ôø",

                            "ôû", "ôõ", "ôï", "ô", "í", "ì", "æ", "ó", "ò", "yù", "yø", "yû", "yõ", "î",

                            "ñ", "AÁ", "AÀ", "AÅ", "AÃ", "AÄ", "AÂ", "AÛ", "AÕ",

                            "AÏ", "AÉ", "AÈ", "AÚ", "AÜ", "AË", "AÊ", "UÙ", "UØ", "UÛ", "UÕ",

                            "UÏ", "ÖÙ", "ÖØ", "ÖÛ", "ÖÕ", "ÖÏ", "Ö", "EÁ", "EÀ", "EÅ",

                            "EÃ", "EÄ", "EÂ", "EÙ", "EØ", "EÛ", "EÕ", "EÏ", "OÁ", "OÀ", "OÅ",

                            "OÃ", "OÄ", "OÛ", "OÕ", "OÏ", "ÔÙ", "ÔØ", "ÔÛ",

                            "ÔÕ", "ÔÏ", "Ô", "Í", "Ì", "Æ", "Ó", "Ò", "YÙ", "YØ", "YÛ", "YÕ",

                            "Î", "Ñ", "aù", "aø", "oâ", "où", "oø", "AÙ", "AØ", "OÂ", "OÙ", "OØ"};



            string result = strInput;

            for (int i = 0; i < 134; i++)
            {

                result = result.Replace(Vni[i], Convert.ToChar(maAcii[i]).ToString());

            }

            return result;

        }

        public static string ConvertTCVN2Unicode(string strInput)
        {
            string tcvnchars = "­µ¸¶·¹¨»¾¼½Æ©ÇÊÈÉË®ÌÐÎÏÑªÒÕÓÔÖ×ÝØÜÞßãáâä«åèæçé¬êíëìîïóñòô*õøö÷ùúýûüþ¡¢§£¤¥¦";
            char[] unichars = { 'ư', 'à', 'á', 'ả', 'ã', 'ạ', 'ă', 'ằ', 'ắ', 'ẳ', 'ẵ', 'ặ', 'â', 'ầ', 'ấ', 'ẩ', 'ẫ', 'ậ', 'đ', 'è', 'é', 'ẻ', 'ẽ', 'ẹ', 'ê', 'ề', 'ế', 'ể', 'ễ', 'ệ', 'ì', 'í', 'ỉ', 'ĩ', 'ị', 'ò', 'ó', 'ỏ', 'õ', 'ọ', 'ô', 'ồ', 'ố', 'ổ', 'ỗ', 'ộ', 'ơ', 'ờ', 'ớ', 'ở', 'ỡ', 'ợ', 'ù', 'ú', 'ủ', 'ũ', 'ụ', 'ư', 'ừ', 'ứ', 'ử', 'ữ', 'ự', 'ỳ', 'ý', 'ỷ', 'ỹ', 'ỵ', 'Ă', 'Â', 'Đ', 'Ê', 'Ô', 'Ơ', 'Ư' };
            string result = "";
            for (int i = 0; i < strInput.Length; i++)
            {
                if (tcvnchars.Contains(strInput[i] + ""))
                {
                    result += unichars[tcvnchars.IndexOf(strInput[i] + "")];
                }
                else result += strInput[i];
            }

            return result;

        }
        #endregion

        #region Form messages & Database errors

        public enum DBErrorType
        {
            None = -1,
            RecordOutOfDate = 0,
            AddExistedRecord = 1,
            RecordNotExisted = 2,
            UnknownError = 3,
            AccountIsNotExisted = 4,
            PasswordIsNotCorrect = 5,
            AccountIsLocked = 6,
            DataLengthTruncated = 7
        }

        private static string[] DBMessageList = { 
        	"Chứng từ/bản ghi {0} này đã bị chỉnh sửa bởi người khác!", //0
        	"Chứng từ/bản ghi {0} này đã tồn tại!",//1
        	"Không tìm thấy chứng từ/bản ghi {0} này!",//2
            "Không thể cập nhật chứng từ/bản ghi {0} này!",//3
            "Tài khoản {0} này không tồn tại trong hệ thống!",//4
            "Mật khẩu không chính xác!",//5
            "Tài khoản {0} này đã bị khóa, xin vui lòng liên hệ quản trị mạng!",//6
            "Dữ liệu nhập vào dài hơn độ dài cho phép!"//7
        };

        public enum FormMessageType
        {
            UpdateSuccess = 0,
            UpdateFail = 1,
            AddSuccessConfirm = 2,
            AddFail = 3,
            DisposeSuccess = 4,
            DisposeFail = 5,
            ConfirmDispose = 6,
            ConfirmCancel = 7,
            ConfirmAccept = 8,
            CloseFormNotReady = 9,
            RecordNotFound = 10,
            ReportNotFound = 11,
            LoginFail = 12,
            NotAllơwDisposeRelateReportData = 13,
            ConfirmDisposeNoReason = 14,
        }

        private static string[] FormMessageList = { 
        	"Cập nhật {0} thành công", //0
        	"Không thể cập nhật {0} này đuợc.\r\nXin vui lòng thử lại lần sau.",//1
        	"Thêm mới {0} thành công\r\nBạn có muốn thêm mới {0} nữa không?",//2
        	"Thêm mới {0} không thành công",//3
        	"Hủy chứng từ {0} thành công",//4
        	"Hủy chứng từ {0} không thành công.\r\nXin vui lòng thử lại lần sau.",//5
        	"Bạn có chắc là bạn muốn hủy chứng từ {0} này không?",//6
        	"Bạn có chắc là bạn muốn hủy thao tác không?\r\nMọi thay đổi của bạn sẽ không được lưu lại.",//7
        	"Bạn có chắc là bạn muốn xác nhận bắt đầu cho {0} này không?",//8
            "Bạn phải lưu lại hoặc hủy thao tác trước khi đóng cửa sổ này!!",//9
            "Không tìm thấy {0}!!",//10
            "Không tìm thấy tập tin báo cáo mẫu [{0}]!!",//11
            "Đăng nhập không thành công!!",//12
            "Bạn không thể hủy chứng từ này được do dữ liệu báo cáo đã bị khóa!!",//13            
            "Bạn có chắc là bạn muốn hủy chứng từ {0} này không?",//14
        };

        public static ReturnSet FormMessage(FormMessageType type, string name)
        {
            return FormMessage(type, new string[] { name }, null, DBErrorType.None);
        }

        public static ReturnSet FormMessage(FormMessageType type, string[] name)
        {
            return FormMessage(type, name, null, DBErrorType.None);
        }

        public static ReturnSet FormMessage(FormMessageType type, string name, string detailMessage)
        {
            return FormMessage(type, new string[] { name }, detailMessage, DBErrorType.None);
        }

        public static ReturnSet FormMessage(FormMessageType type, string[] name, string detailMessage)
        {
            return FormMessage(type, name, detailMessage, DBErrorType.None);
        }

        public static ReturnSet FormMessage(FormMessageType type, string name, string detailMessage, DBErrorType errorType)
        {
            return FormMessage(type, new string[] { name }, detailMessage, errorType);
        }

        public static ReturnSet FormMessage(FormMessageType type, string[] name, string detailMessage, DBErrorType errorType)
        {
            string displayName = null; //do not display name if null

            if (name == null)
            {
                displayName = null;
            }
            else if (name.Length == 1 && StringLib.isValid(name[0]))//display object name only
            {
                displayName = name[0].Trim();
            }
            else if (name.Length >= 2) //display object name and record info
            {
                displayName = string.Format("{0} [{1}]", name[0].Trim(), name[1].Trim());
            }


            string message = null;
            if (!StringLib.isValid(displayName))//do not display name if null
            {
                message = FormMessageList[(int)type].Replace("{0} ", "");
            }
            else
            {
                message = string.Format(FormMessageList[(int)type], displayName);
            }

            //add detail message if available
            if (StringLib.isValid(detailMessage))
            {
                message += "\r\n" + detailMessage;
            }

            //add database error message if available
            if (errorType != DBErrorType.None)
            {
                if (!StringLib.isValid(displayName))//do not display name if null
                {
                    message += "\r\n\r\nLỗi: " + DBMessageList[(int)errorType].Replace("{0} ", "");
                }
                else
                {
                    message += "\r\n\r\nLỗi: " + string.Format(DBMessageList[(int)errorType], displayName);
                }
            }

            if (type.ToString().ToLower().Contains("confirm"))
            {
                if (type == FormMessageType.ConfirmDispose)
                {
                    ConfirmDisposeDialog form = new ConfirmDisposeDialog();
                    form.FormMessage = message;
                    form.ShowDialog();

                    return new ReturnSet(form.DialogResult == DialogResult.OK, form.FormResultMessage, form.FormResultMessage);
                }
                return new ReturnSet(FormLib.confirm(message, "Thông báo"));
            }
            else
            {
                FormLib.alert(message, "Thông báo");
            }

            return new ReturnSet(true);
        }
        #endregion

        #region Form helper

        public static void InitListFormButton(Form form, Button btn_select, Button btn_search, Button btn_view, Button btn_new)
        {
            //not for init second time
            if (form.AccessibleName == form.Name)
                return;

            form.AccessibleName = form.Name; //set this value to flag for preventing form from init second times

            form.Icon = Resources.logo32;
            btn_select.AutoSize = btn_view.AutoSize = btn_new.AutoSize = btn_search.AutoSize = true;

            btn_select.Text = "&Chọn (F1)";
            btn_view.Text = "&Xem chi tiết (F2)";
            btn_new.Text = "Thêm &mới (F3)";
            btn_search.Text = "&Tìm (F4)";

            ToolTip tooltip = new ToolTip();
            tooltip.SetToolTip(btn_select, "Chọn một danh mục(F1)");
            tooltip.SetToolTip(btn_view, "Xem chi tiết một danh mục (F2)");
            tooltip.SetToolTip(btn_new, "Thêm mới danh mục (F3)");
            tooltip.SetToolTip(btn_search, "Tìm kiếm danh mục(F4)");

            form.KeyPreview = true;
            form.KeyUp += delegate(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.F1: btn_select.PerformClick(); break;
                    case Keys.F2: btn_view.PerformClick(); break;
                    case Keys.F3: btn_new.PerformClick(); break;
                    case Keys.F4: btn_search.PerformClick(); break;
                }
            };
        }

        public static void InitDetailFormButton(Form form, Button btn_add, Button btn_update, Button btn_confirm, Button btn_dispose, Button btn_cancel, Button btn_save, Button btn_print)
        {
            //not for init second time
            if (form.AccessibleName == form.Name)
                return;

            form.AccessibleName = form.Name; //set this value to flag for preventing form from init second times
            form.Icon = Resources.logo32;
            form.Tag = true;

            if (btn_print != null)
            {
                btn_print.AutoSize = true;
                btn_print.Text = "&In báo cáo (F7)";
            }

            if (btn_add != null)
            {
                btn_add.AutoSize = true;
                btn_add.Text = "Thêm &mới (F1)";
            }

            if (btn_cancel != null)
            {
                btn_cancel.AutoSize = true;
                btn_cancel.Text = "&Hủy (F5)";
            }

            if (btn_confirm != null)
            {
                btn_confirm.AutoSize = true;
                btn_confirm.Text = "&Xác nhận (F3)";
            }

            if (btn_dispose != null)
            {
                btn_dispose.AutoSize = true;
                btn_dispose.Text = "Hủy C&T (F4)";
            }

            if (btn_save != null)
            {
                btn_save.AutoSize = true;
                btn_save.Text = "&Lưu (F6)";
            }

            if (btn_update != null)
            {
                btn_update.AutoSize = true;
                btn_update.Text = "&Cập nhật (F2)";
            }

            form.KeyPreview = true;
            form.KeyUp += delegate(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.F1: if (btn_add != null) btn_add.PerformClick(); break;
                    case Keys.F2: if (btn_update != null) btn_update.PerformClick(); break;
                    case Keys.F3: if (btn_print != null) btn_confirm.PerformClick(); break;
                    case Keys.F4: if (btn_print != null) btn_dispose.PerformClick(); break;
                    case Keys.F5: if (btn_print != null) btn_cancel.PerformClick(); break;
                    case Keys.F6: if (btn_print != null) btn_save.PerformClick(); break;
                    case Keys.F7: if (btn_print != null) btn_print.PerformClick(); break;
                    case Keys.Escape: form.Close(); break;
                    case Keys.Enter: if (form.Tag != null && (bool)form.Tag == true) WindowLib.PressKey(Keys.Tab); break;
                }
            };
        }

        public static void InitDetailFormButton(Form form, Button btn_add, Button btn_copy, Button btn_update, Button btn_confirm, Button btn_dispose, Button btn_cancel, Button btn_save, Button btn_print)
        {
            //not for init second time
            if (form.AccessibleName == form.Name)
                return;

            form.AccessibleName = form.Name; //set this value to flag for preventing form from init second times
            form.Icon = Resources.logo32;
            form.Tag = true;

            if (btn_print != null)
            {
                btn_print.AutoSize = true;
                btn_print.Text = "&In báo cáo (F7)";
            }

            if (btn_add != null)
            {
                btn_add.AutoSize = true;
                btn_add.Text = "Thêm &mới (F1)";
            }

            if (btn_cancel != null)
            {
                btn_cancel.AutoSize = true;
                btn_cancel.Text = "&Hủy (F5)";
            }

            if (btn_confirm != null)
            {
                btn_confirm.AutoSize = true;
                btn_confirm.Text = "&Xác nhận (F3)";
            }

            if (btn_dispose != null)
            {
                btn_dispose.AutoSize = true;
                btn_dispose.Text = "Hủy C&T (F4)";
            }

            if (btn_save != null)
            {
                btn_save.AutoSize = true;
                btn_save.Text = "&Lưu (F6)";
            }

            if (btn_update != null)
            {
                btn_update.AutoSize = true;
                btn_update.Text = "&Cập nhật (F2)";
            }

            if (btn_copy != null)
            {
                btn_copy.AutoSize = true;
                btn_copy.Text = "Nhân đôi (F8)";
            }

            form.KeyPreview = true;
            form.KeyUp += delegate(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.F1: if (btn_add != null) btn_add.PerformClick(); break;
                    case Keys.F2: if (btn_update != null) btn_update.PerformClick(); break;
                    case Keys.F3: if (btn_print != null) btn_confirm.PerformClick(); break;
                    case Keys.F4: if (btn_print != null) btn_dispose.PerformClick(); break;
                    case Keys.F5: if (btn_print != null) btn_cancel.PerformClick(); break;
                    case Keys.F6: if (btn_print != null) btn_save.PerformClick(); break;
                    case Keys.F7: if (btn_print != null) btn_print.PerformClick(); break;
                    case Keys.F8: if (btn_copy != null) btn_copy.PerformClick(); break;
                    case Keys.Escape: form.Close(); break;
                    case Keys.Enter: if (form.Tag != null && (bool)form.Tag == true) WindowLib.PressKey(Keys.Tab); break;
                }
            };
        }

        public static void InitTextBoxListUpDown(Control[] controls, DataGridView dgv)
        {
            foreach (var item in controls)
            {
                item.KeyDown += delegate(object sender, KeyEventArgs e)
                {
                    Control control = (Control)sender;
                    switch (e.KeyCode)
                    {
                        case Keys.Up: MoveNextIndex(-1, dgv); break;
                        case Keys.Down: MoveNextIndex(1, dgv); break;
                    }
                };
            }
        }

        private static void MoveNextIndex(int index, DataGridView dgv)
        {
            if (dgv.CurrentRow == null) return;

            int currentIndex = dgv.CurrentRow.Index;
            currentIndex += index;

            if (currentIndex < 0)
            {
                currentIndex = 0;
            }

            if (currentIndex >= dgv.Rows.Count)
            {
                currentIndex = dgv.Rows.Count - 1;
            }

            dgv.ClearSelection();
            //dgv_list.Rows[currentIndex].Selected = true;
            dgv.CurrentCell = dgv.Rows[currentIndex].Cells[1];
        }

        public enum StatusType { Status, Nam_Nu, RoleCode, ContestStatus}

        public static void InitStatusCombobox(ComboBox control, StatusType status)
        {
            InitStatusCombobox(control, status, true);
        }

        public static void InitStatusCombobox(ComboBox control, StatusType status, bool showSelectAll)
        {

            string dataType = "";

            switch (status)
            {
                case StatusType.Status: dataType = "Đang hoạt động,A,Bị khóa,L";
                    break;
                case StatusType.Nam_Nu: dataType = "Nam,1,Nữ,0";
                    break;
                case StatusType.RoleCode: dataType = "Admin,0,Quan sát viên,1,Giám khảo,2";
                    break;
                case StatusType.ContestStatus: dataType = "Tạo mới,O,Đang hoạt động,A,Đã kết thúc,F,Bị khóa,L";
                    break;                
            }

            InitStatusCombobox(control, dataType, showSelectAll);
        }

        public static void InitStatusCombobox(ComboBox control, string customData, bool showSelectAll)
        {

            string[] items = customData.Split(',');

            InitStatusCombobox(control, items.ToList(), showSelectAll);
        }

        public static void InitStatusCombobox(ComboBox control, List<string> itemlist, bool showSelectAll)
        {
            DataTable table = DataLib.initDataTable("StatusType[ Code, Name ]");
            if (showSelectAll)
            {
                itemlist.Insert(0, "");
                itemlist.Insert(0, "Tất cả");
            }

            for (int i = 0; i < itemlist.Count; i += 2)
            {
                table.Rows.Add(new object[] { itemlist[i + 1], itemlist[i] });
            }

            control.DropDownStyle = ComboBoxStyle.DropDownList;

            control.DataSource = table;
            control.DisplayMember = "Name";
            control.ValueMember = "Code";
        }

        public static void InitDataGridView(DataGridView control, DataGridViewColumn[] columns)
        {
            foreach (var col in columns)
            {
                control.Columns.Add(col);
            }
        }

        #region DataGridView Helpers

        public enum GenColumnType { Text, CheckBox, ComboBox, Button, Image, Link, DateTime }
        public static DataGridViewColumn GenColumn(string HeaderText, string DataPropertyName, GenColumnType type, bool Visible, bool ReadOnly, DataGridViewAutoSizeColumnMode AutoSizeMode, DataGridViewColumnSortMode SortMode, int width, DataGridViewContentAlignment align, List<String> ListStr)
        {
            dynamic column;
            switch (type)
            {
                case GenColumnType.CheckBox: column = new DataGridViewCheckBoxColumn();
                    break;
                case GenColumnType.ComboBox: column = new DataGridViewComboBoxColumn();
                    break;
                case GenColumnType.Image: column = new DataGridViewImageColumn();
                    break;
                case GenColumnType.Link: column = new DataGridViewLinkColumn();
                    break;
                case GenColumnType.Button: column = new DataGridViewButtonColumn();
                    break;
                case GenColumnType.DateTime: column = new CalendarColumn();
                    break;
                case GenColumnType.Text:
                default:
                    column = new DataGridViewTextBoxColumn();
                    break;
            }

            column.Name = DataPropertyName;
            column.HeaderText = StringLib.isValid(HeaderText) ? HeaderText : GetColumnHeaderText(DataPropertyName);
            column.DataPropertyName = DataPropertyName;
            column.SortMode = SortMode;
            column.AutoSizeMode = AutoSizeMode;
            column.Width = width;
            column.Visible = Visible;
            column.ReadOnly = ReadOnly;

            if (type != GenColumnType.CheckBox)
            {
                DataGridViewCellStyle style = new DataGridViewCellStyle();
                style.Alignment = align;
                column.DefaultCellStyle = style;
            }

            if (type == GenColumnType.ComboBox && ListStr != null)
            {
                foreach (var item in ListStr)
                {
                    column.Items.Add(item);
                }
            }

            return column;
        }

        private static string GetColumnHeaderText(string DataPropertyName)
        {
            //group text
            DataPropertyName = DataPropertyName.Replace("DangDung", "Dạng dùng ");
            DataPropertyName = DataPropertyName.Replace("HamLuong", "Hàm lượng");
            DataPropertyName = DataPropertyName.Replace("SuDung", "Tình trạng ");
            DataPropertyName = DataPropertyName.Replace("GhiChu", "Ghi chú");
            DataPropertyName = DataPropertyName.Replace("LyDo", "Lý do ");
            DataPropertyName = DataPropertyName.Replace("TinhTrang", "Tình trạng ");
            DataPropertyName = DataPropertyName.Replace("HieuLuc", "hiệu lực ");
            DataPropertyName = DataPropertyName.Replace("SoCTKhungGiaBHYT", "Số chứng từ ");
            DataPropertyName = DataPropertyName.Replace("QuocGia", "Quốc Gia ");
            DataPropertyName = DataPropertyName.Replace("DichVu", "Dịch Vụ ");
            DataPropertyName = DataPropertyName.Replace("NamSinh", "Năm Sinh ");
            DataPropertyName = DataPropertyName.Replace("GioiTinh", "Giới Tính ");
            DataPropertyName = DataPropertyName.Replace("BenhNhan", "Bệnh Nhân ");
            DataPropertyName = DataPropertyName.Replace("TenNhomBHYT", "Tên Nhóm BHYT");
            DataPropertyName = DataPropertyName.Replace("TreEm", "Trẻ em ");
            DataPropertyName = DataPropertyName.Replace("NguoiLon", "Người lớn ");
            DataPropertyName = DataPropertyName.Replace("ThucNhan", "Thực Nhận ");
            DataPropertyName = DataPropertyName.Replace("BatDau", "Bắt Đầu ");
            DataPropertyName = DataPropertyName.Replace("KetThuc", "Kết Thúc ");
            DataPropertyName = DataPropertyName.Replace("BoPhan", "Bộ Phận ");
            DataPropertyName = DataPropertyName.Replace("TamUng", "Tạm Ứng ");
            DataPropertyName = DataPropertyName.Replace("MuaHang", "Mua Hàng ");
            DataPropertyName = DataPropertyName.Replace("PhatSinh", "Phát Sinh ");

            //single text
            DataPropertyName = DataPropertyName.Replace("Con", "Còn ");
            DataPropertyName = DataPropertyName.Replace("Lai", "Lại ");
            DataPropertyName = DataPropertyName.Replace("Tra", "Trả ");
            DataPropertyName = DataPropertyName.Replace("Phai", "Phải ");
            DataPropertyName = DataPropertyName.Replace("Dieu", "Điều ");
            DataPropertyName = DataPropertyName.Replace("Tri", "Trị ");
            DataPropertyName = DataPropertyName.Replace("Chi", "Chi ");
            DataPropertyName = DataPropertyName.Replace("Phi", "Phí ");
            DataPropertyName = DataPropertyName.Replace("Benh", "Bệnh ");
            DataPropertyName = DataPropertyName.Replace("An", "Án ");
            DataPropertyName = DataPropertyName.Replace("YTe", "Y Tế ");
            DataPropertyName = DataPropertyName.Replace("Tong", "Tổng ");
            DataPropertyName = DataPropertyName.Replace("Tao", "Tạo ");
            DataPropertyName = DataPropertyName.Replace("Tien", "Tiền ");
            DataPropertyName = DataPropertyName.Replace("Lap", "Lập ");
            DataPropertyName = DataPropertyName.Replace("So", "Số ");
            DataPropertyName = DataPropertyName.Replace("CT", "Chứng Từ ");
            DataPropertyName = DataPropertyName.Replace("Ten", "Tên ");
            DataPropertyName = DataPropertyName.Replace("Khung", "Khung ");
            DataPropertyName = DataPropertyName.Replace("Gia", "Giá ");
            DataPropertyName = DataPropertyName.Replace("Cu", "Cũ ");
            DataPropertyName = DataPropertyName.Replace("Moi", "Mới ");
            DataPropertyName = DataPropertyName.Replace("Nuoc", "Nước ");
            DataPropertyName = DataPropertyName.Replace("Hang", "Hãng ");
            DataPropertyName = DataPropertyName.Replace("SX", "Sản Xuất ");
            DataPropertyName = DataPropertyName.Replace("DVT", "Đơn vị tính ");
            DataPropertyName = DataPropertyName.Replace("Nhom", "Nhóm ");
            DataPropertyName = DataPropertyName.Replace("Thuoc", "Thuốc ");
            DataPropertyName = DataPropertyName.Replace("DV", "Dịch vụ ");
            DataPropertyName = DataPropertyName.Replace("Noi", "Nội ");
            DataPropertyName = DataPropertyName.Replace("Tru", "trú ");
            DataPropertyName = DataPropertyName.Replace("Ngoai", "Ngoại ");
            DataPropertyName = DataPropertyName.Replace("Nguoi", "Người ");
            DataPropertyName = DataPropertyName.Replace("Ngay", "Ngày ");
            DataPropertyName = DataPropertyName.Replace("Cap", "cập ");
            DataPropertyName = DataPropertyName.Replace("Nhat", "nhật ");
            DataPropertyName = DataPropertyName.Replace("Huy", "hủy ");
            DataPropertyName = DataPropertyName.Replace("Ma", "Mã ");
            DataPropertyName = DataPropertyName.Replace("Nhap", "Nhập ");
            DataPropertyName = DataPropertyName.Replace("Xuat", "Xuất ");
            DataPropertyName = DataPropertyName.Replace("Vien", "Viện ");
            DataPropertyName = DataPropertyName.Replace("_ID", "");
            DataPropertyName = DataPropertyName.Replace("_", " ");

            return DataPropertyName.Trim();
        }

        public static DataGridViewColumn GenColumn(string HeaderText, string DataPropertyName, bool Visible)
        {
            return GenColumn(HeaderText, DataPropertyName, GenColumnType.Text, Visible, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string HeaderText, string DataPropertyName)
        {
            return GenColumn(HeaderText, DataPropertyName, GenColumnType.Text, true, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string HeaderText, string DataPropertyName, DataGridViewContentAlignment align)
        {
            return GenColumn(HeaderText, DataPropertyName, GenColumnType.Text, true, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, align, null);
        }

        public static DataGridViewColumn GenColumn(string HeaderText, string DataPropertyName, GenColumnType type, bool Visible)
        {
            return GenColumn(HeaderText, DataPropertyName, type, Visible, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string HeaderText, string DataPropertyName, GenColumnType type)
        {
            return GenColumn(HeaderText, DataPropertyName, type, true, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string HeaderText, string DataPropertyName, GenColumnType type, List<String> ListStr)
        {
            return GenColumn(HeaderText, DataPropertyName, type, true, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, ListStr);
        }

        public static DataGridViewColumn GenColumn(string HeaderText, string DataPropertyName, GenColumnType type, DataGridViewContentAlignment align)
        {
            return GenColumn(HeaderText, DataPropertyName, type, true, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, align, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName, bool Visible)
        {
            return GenColumn(null, DataPropertyName, GenColumnType.Text, Visible, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName, bool Visible, DataGridViewAutoSizeColumnMode AutoSizeMode)
        {
            return GenColumn(null, DataPropertyName, GenColumnType.Text, Visible, true, AutoSizeMode, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName)
        {
            return GenColumn(null, DataPropertyName, GenColumnType.Text, true, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName, DataGridViewContentAlignment align)
        {
            return GenColumn(null, DataPropertyName, GenColumnType.Text, true, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, align, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName, DataGridViewAutoSizeColumnMode AutoSizeMode)
        {
            return GenColumn(null, DataPropertyName, GenColumnType.Text, true, true, AutoSizeMode, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName, GenColumnType type, bool Visible)
        {
            return GenColumn(null, DataPropertyName, type, Visible, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName, GenColumnType type, bool Visible, DataGridViewAutoSizeColumnMode AutoSizeMode)
        {
            return GenColumn(null, DataPropertyName, type, Visible, true, AutoSizeMode, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName, GenColumnType type)
        {
            return GenColumn(null, DataPropertyName, type, true, true, DataGridViewAutoSizeColumnMode.AllCells, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn GenColumn(string DataPropertyName, GenColumnType type, DataGridViewAutoSizeColumnMode AutoSizeMode)
        {
            return GenColumn(null, DataPropertyName, type, true, true, AutoSizeMode, DataGridViewColumnSortMode.NotSortable, 75, DataGridViewContentAlignment.MiddleLeft, null);
        }

        public static DataGridViewColumn SetWidth(this DataGridViewColumn col, int width)
        {
            col.Width = width;
            return col;
        }

        public static DataGridViewColumn SetSizeMode(this DataGridViewColumn col, DataGridViewAutoSizeColumnMode size)
        {
            col.AutoSizeMode = size;
            return col;
        }

        public static DataGridViewColumn SetSortMode(this DataGridViewColumn col, DataGridViewColumnSortMode sort)
        {
            col.SortMode = sort;
            return col;
        }

        public static DataGridViewColumn SetReadOnly(this DataGridViewColumn col, bool readOnly)
        {
            col.ReadOnly = readOnly;
            return col;
        }

        public static DataGridViewColumn SetVisible(this DataGridViewColumn col, bool visible)
        {
            col.Visible = visible;
            return col;
        }

        public static DataGridViewColumn SetFormat(this DataGridViewColumn col, string format)
        {
            col.DefaultCellStyle.Format = format;
            return col;
        }

        public static DataGridViewColumn SetAlign(this DataGridViewColumn col, DataGridViewContentAlignment align)
        {
            if (col.DefaultCellStyle != null)
            {
                col.DefaultCellStyle.Alignment = align;
            }
            else
            {
                DataGridViewCellStyle style = new DataGridViewCellStyle();
                style.Alignment = align;
                col.DefaultCellStyle = style;
            }
            return col;
        }

        public static DataGridViewColumn SetComboboxItems(this DataGridViewColumn col, string[] items)
        {
            if (col.GetType().Name == "DataGridViewComboBoxColumn")
            {
                ((DataGridViewComboBoxColumn)col).Items.AddRange(items);
            }

            return col;
        }

        public static DataGridViewColumn SetColor(this DataGridViewColumn col, Color color)
        {
            col.DefaultCellStyle.BackColor = color;
            return col;
        }

        public static DataGridViewColumn SetForeColor(this DataGridViewColumn col, Color color)
        {
            col.DefaultCellStyle.ForeColor = color;
            return col;
        }

        public static DataGridViewColumn SetFrozen(this DataGridViewColumn col, bool Frozen)
        {
            col.Frozen = Frozen;
            return col;
        }
        #endregion

        //public static void InitQuickLookupField(Form form, TextBox control, List<DM_DangDung> datasource)
        //{
        //    ListBox lbx_list = null;
        //    foreach (Control child in form.Controls)
        //    {
        //        if (child.Name == "lbx_list_auto_lookup")
        //        {
        //            lbx_list = (ListBox)child;
        //            break;
        //        }
        //    }
        //    if (lbx_list == null)
        //    {
        //        lbx_list = new ListBox();
        //        lbx_list.Name = "lbx_list_auto_lookup";
        //        lbx_list.Width = control.Width;                
        //        lbx_list.Height = 200;
        //        form.Controls.Add(lbx_list);
        //    }

        //    control.TextChanged += delegate { 
        //        datasource.Where( x => x
        //    };
        //}

        public static string ConvertASCII(string content)
        {
            string src = "áàảãạâấầẩẫậăắằẳẵặđéèẻẽẹêếềểễệíìỉĩịóòỏõọôốồổỗộơớờởỡợúùủũụưứừửữựýỳỷỹỵÁÀẢÃẠÂẤẦẨẪẬĂẮẰẲẴẶĐÉÈẺẼẸÊẾỀỂỄỆÍÌỈĨỊÓÒỎÕỌÔỐỒỔỖỘƠỚỜỞỠỢÚÙỦŨỤƯỨỪỬỮỰÝỲỶỸỴ";
            string src1 = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAADEEEEEEEEEEEIIIIIOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYY";
            string str = "";
            string str1 = "";
            for (int i = 0; i < src.Length; i++)
            {
                str = src.Substring(i, 1);
                str1 = src1.Substring(i, 1);
                content = content.Replace(str, str1);
            }

            return content;
        }

        #endregion

        #region Entity Framework
        public static DbTransaction BeginTransaction(this PhotoMgrEntities context)
        {
            if (context.Connection.State != ConnectionState.Open)
            {
                context.Connection.Open();
            }
            return context.Connection.BeginTransaction();
        }

        #endregion

        public static void UpdateLoginAccount(User account)
        {
            UserAccount.Instance.Fullname = account.Fullname;
            UserAccount.Instance.UserID = account.UserID;
            UserAccount.Instance.Username = account.Username;
            UserAccount.Instance.RoleCode = (int)account.RoleCode;
        }

        public static void WriteLog(object ex, string explain)
        {
            FileLib.writeLog("Log-" + Global.GetServerDateTime().ToString("yyyy-MM-dd") + ".txt", ex, explain);
        }

        public static DateTime GetServerDateTime()
        {
            if (ShiftTime.Ticks == 0)
            {
                ShiftTime = DBManager.Get_ServerDateTime().Subtract(DateTime.Now);
            }

            return DateTime.Now.Add(ShiftTime);
        }

        public static string NumberToWords(this int number)
        {
            if (number == 0)
                return "zero";

            if (number < 0)
                return "minus " + NumberToWords(Math.Abs(number));

            string words = "";

            if ((number / 1000000000) > 0)
            {
                words += NumberToWords(number / 1000000000) + " billion ";
                number %= 1000000000;
            }

            if ((number / 1000000) > 0)
            {
                words += NumberToWords(number / 1000000) + " million ";
                number %= 1000000;
            }

            if ((number / 1000) > 0)
            {
                words += NumberToWords(number / 1000) + " thousand ";
                number %= 1000;
            }

            if ((number / 100) > 0)
            {
                words += NumberToWords(number / 100) + " hundred ";
                number %= 100;
            }

            if (number > 0)
            {
                if (words != "")
                    words += "and ";

                var unitsMap = new[] { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" };
                var tensMap = new[] { "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" };

                if (number < 20)
                    words += unitsMap[number];
                else
                {
                    words += tensMap[number / 10];
                    if ((number % 10) > 0)
                        words += "-" + unitsMap[number % 10];
                }
            }

            return words;
        }

        public static double getDoubleByDot(object obj, int decimalLength)
        {
            if (obj == null) return 0;
            string number = fixNumber(obj.ToString());
            int dotIndexer = number.IndexOf(".");

            if (dotIndexer >= 0 && number.Length - dotIndexer > decimalLength + 1)
                number = number.Substring(0, dotIndexer + decimalLength + 1);

            number = number.Replace(".", NumberLib.DecimalSymbol.ToString());

            return Convert.ToDouble(number);
        }

        public static string fixNumber(object obj)
        {
            string number = StringLib.filterStr(obj.ToString(), "-0123456789.");

            if (number.IndexOf("-") >= 0)
            {
                if (number.StartsWith("-")) number = "=" + number;
                number = number.Replace("-", "").Replace("=", "-");
            }

            if (number.IndexOf(".") >= 0)
            {
                if (number.StartsWith(".")) number = "0" + number;
                if (number.EndsWith(".")) number = number.Substring(0, number.Length - 1);
                number = StringLib.Replace1time(number, ".", "*").Replace(".", "").Replace("*", ".");
            }

            if ((number.IndexOf("-") == 0 && number.Length == 1) || number == "-0" || number.Length == 0) return "0";

            return number;
        }

        public static string ToFormatMoney(this double money)
        {
            return money.ToString("#,0");
        }

        #region List Process
        public static void XoaPTTrung(List<String> list)
        {
            for (int i = 0; i < list.Count; i++)
            {
                for (int j = 0; j < list.Count; j++)
                {
                    if (list[i] == list[j] && i != j)
                    {
                        list.Remove(list[i]);
                    }
                }
            }
        }

        public static List<String> LayListTrung(List<String> list)
        {
            List<String> mylist = new List<String>();

            for (int i = 0; i < list.Count; i++)
            {
                for (int j = 0; j < list.Count; j++)
                {
                    if (list[i].ToLower() == list[j].ToLower() && i != j)
                    {
                        mylist.Add(list[i]);
                    }
                }
            }

            return mylist;
        }

        public static List<String> ListThangNam()
        {
            List<String> mylist = new List<String>();
            for (int j = 1940; j < 2040; j++)
            {
                for (int i = 1; i <= 12; i++)
                {
                    String myString = i + "/" + j;
                    mylist.Add(myString);
                }
            }

            return mylist;
        }
        #endregion

        #region String Process
        public static String VietHoaChuDau(String TenStr)
        {
            String result = TenStr.Trim().ToLower();

            result = StringLib.UpperFirstLetter(result);

            return result;
        }

        public static String GetString(object obj)
        {
            if (obj == null)
            {
                return "";
            }

            return obj.ToString();
        }

        public static String GetStringChuan(String Chuoi)
        {
            String ChuoiChuan = Chuoi.Trim();

            while (ChuoiChuan.Contains("  "))
            {
                ChuoiChuan.Replace("  ", " ");
            }
            return ChuoiChuan;
        }
        #endregion

        public static string GetStatusName(string status, bool isContestStatus = false)
        {
            switch( status )
            {
                case "A":
                    return isContestStatus ? "Đang hoạt động" : "Đang hoạt động";
                case "L":
                    return isContestStatus ? "Bị khóa" : "Bị khóa";
                case "F":
                    return isContestStatus ? "Kết thúc" : "Kết thúc";
                case "O":
                    return isContestStatus ? "Tạo mới" : "Tạo mới";
            }
            return status;
        }

        public static string GetRoleName(int role)
        {
            switch (role)
            {
                case 0:
                    return "Admin";
                case 1:
                    return "Quan sát viên";
                case 2:
                    return "Giám khảo";
            }
            return role+"";
        }
        
        public static void UpdateStatusName(IQueryable<object> list, bool isContestStatus, bool isUserRole)
        {
            foreach (dynamic item in list)
            {
                item.StatusName = GetStatusName(item.Status, isContestStatus);
                if (isUserRole) item.RoleName = GetRoleName(item.RoleCode);
            }
        }
    
    }
}
